// 点相关的算法
#include <stdio.h>
#include <math.h>
#include "point.h"
//两点之间距离
double distance(point p1, point p2)
{
    return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
}
// 判断两点是否重合
bool coincident(point p1, point p2)
{
    return p1.x == p2.x && p1.y == p2.y;
}
// 矢量叉乘 x1*y2-x2*y1
/*
    表征p1与p2的位置关系
    >0 p1 在 p2 右侧
    =0 p1 与 p2 共线
    <0 p1 在 p2 左侧
*/
double corssing(point p1, point p2)
{
    return p1.x * p2.y - p1.y * p2.x;
}

// 矢量点乘 C=|A|*|B|*cosΘ (Θ为A B夹角)
// 点乘的几何意义是可以用来表征或计算两个向量之间的夹角，以及在b向量在a向量方向上的投影
/*
    可以根据正负判断两个向量之间的方向关系 
    >0 夹角0~90   方向基本相同
    =0 正交 90
    <0 夹角90~180 方向基本相反
 */
double Point_multiplication(point p1, point p2)
{
    return p1.x * p2.x + p1.y * p2.y;
}

//判断点是否在线上
bool in_line(point p1, line l1)
{
    // 1.判断点是否在直线范围内
    // 注 这种方法只包括一个端点 若p1==min(l1.s,l1.e) 会返回fasle
    if (p1.x > l1.s.x != p1.x > l1.e.x && p1.y > l1.s.y != p1.y > l1.e.y)
    {
        // 2.叉积==0 说明在
        return !coincident(p1, l1.e);
    }
    return false;
}

// 求一点绕某点旋转angle后的坐标
/*
    绕原点O旋转
    b.x = ( a.x - o.x)*cos(angle) - (a.y - o.y)*sin(angle) + o.x
    b.y = (a.x - o.x)*sin(angle) + (a.y - o.y)*cos(angle) + o.y
 */
point rotation(point p1, point p2, double angle)
{
    point returnpoint;
    returnpoint.x = (p1.x - p2.x) * cos(angle) - (p1.y - p2.y) * sin(angle) + p2.x;
    returnpoint.y = (p1.x - p2.x) * sin(angle) + (p1.y - p2.y) * cos(angle) + p2.y;
    return returnpoint;
}

int main()
{
    /*******************code*******************/
    point p1, p2;
    p1.x = 1, p1.y = 1;
    p2.x = 0, p2.y = 0;
    printf("%lf", distance(p1, p2));
    /******************************************/
    fflush(stdin);

    printf("\n\n****************************\n");
    printf("Press Enter key to continue\n");
    getchar();
    return 0;
    /******************************************/
}
